package cn.jeefast.rest.service.impl;

import cn.jeefast.common.entity.MbCode;
import cn.jeefast.common.utils.R;
import cn.jeefast.rest.dao.MbCodeDao;
import cn.jeefast.rest.service.MbCodeService;
import cn.jeefast.rest.util.SMS;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author theodo
 * @since 2019-12-30
 */
@Service
public class MbCodeServiceImpl extends ServiceImpl<MbCodeDao, MbCode> implements MbCodeService {

    @Autowired
    private MbCodeDao codeDao;

    @Override
    public R getCode(String phone) {
        int i = (int) ((Math.random() * 9 + 1) * 100000);
//        int i= 7777;
        //判断改手机号是否在30分钟内申请发送过验证码
        EntityWrapper ew = new EntityWrapper();
        ew.eq("phone",phone);
        //按时间排序，取到期时间最远的一个
        ew.orderBy("exp_time",false);
        List list = codeDao.selectList(ew);
        if(list.size()==0){
            MbCode mbCode = new MbCode();
            long exp_time = new Date().getTime() + 1800000;
            mbCode.setExpTime(new Date(exp_time));
            mbCode.setCode(String.valueOf(i));
            mbCode.setPhone(phone);
            mbCode.setState(0);
            codeDao.insert(mbCode);
            //TODO 验证码接口，目前同一返回“89898989”
            try {
                Map send = SMS.send(mbCode.getPhone(), "【医点通】您的验证码是" + mbCode.getCode() + "，非本人操作请忽略");
                if((Integer) send.get("code")==0){
                    return R.error("发送失败,错误码"+(Integer) send.get("code")).put("data",null);
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return R.error("发送失败，接口异常，请检查网络通信").put("data",null);
            }
            return R.ok("发送成功").put("data",null);
        }else{
                MbCode mbCode0 = new MbCode();
                long exp_time = new Date().getTime() + 1800000;
                mbCode0.setExpTime(new Date(exp_time));
                mbCode0.setCode(String.valueOf(i));
                mbCode0.setPhone(phone);
                mbCode0.setState(0);
                codeDao.insert(mbCode0);
                try {
                    Map send = SMS.send(mbCode0.getPhone(), "【医点通】您的验证码是" + mbCode0.getCode() + "，非本人操作请忽略");
                    if((Integer) send.get("code")==0){
                        return R.error("发送失败,错误码"+(Integer) send.get("code")).put("data",null);
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    return R.error("发送失败，接口异常，请检查网络通信").put("data",null);
                }
                return R.ok("发送成功").put("data",null);
            }
    }

    /**
     * 核验验证码是否正确
     * @param phone
     * @param code
     * @return
     */
    @Override
    public R checkCode(String phone, String code) {
        EntityWrapper ew = new EntityWrapper();
        ew.eq("phone",phone);
        ew.eq("code",code);
        ew.orderBy("exp_time",false);
        List list = codeDao.selectList(ew);
        if(list.size()==0){
            return R.error("手机号/验证码不正确").put("data",null);
        }
        MbCode mbCode = (MbCode) list.get(0);
        if(mbCode.getState()==1){
            return R.error("验证码已被使用").put("data",null);
        }
        if(!mbCode.getCode().equals(code)){
            return R.error("验证码不正确").put("data",null);
        }
        mbCode.setState(1);
        codeDao.updateById(mbCode);
        return R.ok("验证成功").put("data",null);
    }


}
